package com.itheima.service.impl;

import com.itheima.dao.AccountDao;
import com.itheima.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * TODO:声明式事务
 *          a）SpringConfig类添加@EnableTransactionManagement --》 开启声明式事务
 *          b）SpringConfig类声明 DataSourceTransactionManager
 *          c）在业务方法上 添加注解 @Transactional
 *              事务属性：
 *                  1）isolation
 *                      一般默认即可
 *                  2）readOnly
 *                      增删改默认false，查询true
 *                  3）timeout
 *                      默认-1永不超时
 *                  4）propagation事务的传播行为
 * <p>
 *  TODO：因为事务管理员和事务协调员不能再同一个bean中，所以传播行为不会生效
 */
//@Service
public class AccountService3Impl implements AccountService {
    @Autowired
    private AccountDao dao;

    //s方法：事务管理员 -- 辅助
    @Override
    public void transfer(int outId, int inId, double money) {
        //转账操作
        s1(outId, inId, money);
        //记录日志
        s2(outId, inId, money);
    }

    private void s1(int outId, int inId, double money) {
        dao.outMoney(outId, money);
        //可能在转账过程中发生意外: 转出执行,转入还未执行
//            int i = 1/0;
        dao.inMoney(inId, money);
    }

    private void s2(int out, int in, double money) {
        dao.insertLog("转账操作由" + out + "到" + in + ",金额：" + money);
    }
}
